/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.janalise.util;

import br.com.janalise.control.MapaDoTextoController;
import br.com.janalise.model.MapaDoTexto;
import br.com.janalise.model.Regra;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import org.neodatis.odb.Objects;

/**
 *
 * @author boskyn9
 */
public class BuscarPadrao {

    private List<Regra> regras = new ArrayList<Regra>();
    private MapaDoTextoController control = new MapaDoTextoController();
    private float grauPalavra;
    private float grauFrequencia;
    private float grauRelevante;

    public BuscarPadrao() {
    }

    public BuscarPadrao(List<Regra> regras, Float grauPalavra, Float grauFrequencia, Float grauRelevante) {
        if (regras != null) {
            this.regras = regras;
        }
        this.grauPalavra = grauPalavra != null ? grauPalavra : 0.3f;
        this.grauFrequencia = grauFrequencia != null ? grauFrequencia : 0.9f;
        this.grauRelevante = grauRelevante != null ? grauRelevante : 5f;
    }

    public List comparar() {
        List conceitos = new ArrayList();

        Objects<MapaDoTexto> mapas = control.findAll();
        int cont = 0;
        //busca por todos os textos para comparação das regras
        while (mapas.hasNext()) {
            MapaDoTexto mapa = mapas.next();
//            System.out.println("-----------------------------\ntexto = " + mapa.getTitulo() + "\n\n");
            List<Regra> regrasDoMapa = mapa.getRegras();
            if (regrasDoMapa != null && regrasDoMapa.size() > 0) {
                Integer padraoSize = 0;

                Integer repeticao = 0;
//                Integer cont1 = 0, cont2 = 0;

                for (Regra regra : regras) {
                    if (regra.getOcorrencia() >= grauRelevante) {
                        padraoSize++;
                        //for (Regra regra : regras) { // regras da consulta
//                    System.out.println("---- " + cont1++);
//                    cont2 = 0;
                        String chave = regra.getChave();
                        for (Regra regraDoMapa : regrasDoMapa) {
                            if (regraDoMapa.getOcorrencia() >= grauRelevante) {
                                // for (Regra regraDoMapa : regrasDoMapa) { // regras da comparação
//                        System.out.println(cont++ + " - " + cont2++);
                                String chaveDoMapa = regraDoMapa.getChave();
                                if (chave.hashCode() == chaveDoMapa.hashCode()) {
//                                    System.out.println(regra.getOcorrencia() + "-------------- achei " + chaveDoMapa + " = " + regraDoMapa.getOcorrencia());
                                    Long ocorrencia = regraDoMapa.getOcorrencia();
                                    int faixa1 = (int) (regraDoMapa.getOcorrencia() * grauFrequencia);
                                    int faixa2 = (int) (regra.getOcorrencia() * grauFrequencia);
                                    int faixa = faixa1>faixa2?faixa1:faixa2;
//                                    System.out.println("faixa = "+faixa);
                                    if (regra.getOcorrencia() + faixa >= ocorrencia && regra.getOcorrencia() - faixa <= ocorrencia) {
//                                        System.out.println("tah na frequecia ");
                                        repeticao++;
                                    }
                                }
                            }
                        }
                    }
                }
                if (repeticao >= padraoSize * grauPalavra) {
                    System.out.println(" ok faz parte " + repeticao + " padrão " + padraoSize * grauPalavra);
                    if (mapa.getConceito() != null && !mapa.getConceito().trim().equalsIgnoreCase("") && !conceitos.contains(mapa.getConceito())) {
                        conceitos.add(mapa.getConceito());
                    }
                } else {
                    System.out.println("Não deu!!!!" + repeticao + " padrão " + padraoSize * grauPalavra);
                }
            } else {
                System.out.println(mapa.getTitulo() + " não possui regras");
            }
        }
        System.out.println("-----------");
        System.out.println(conceitos);
        return conceitos;
    }

       public static StringTokenizer sinonimos(String str){
        String dats=null;
        StringTokenizer tokens = null;
        try {
            dats = Arquivo.lerArquivo("./config/th_pt_PT_v2.dat");
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Arquivo /config/th_pt_PT_v2.dat não encontrado ou corrompido.","Erro",JOptionPane.ERROR_MESSAGE);
        }

            int en=0,st=0;
            boolean buscar = false;
            Pattern pattern = Pattern.compile("\n"+str+"\\|\\d",Pattern.CASE_INSENSITIVE);
            Matcher m = pattern.matcher(dats);
                while (m.find()) {
                    buscar = true;
                    st = m.start();
                    en = m.end();
//                    System.out.println(dats.subSequence(st, en));
                    break;
		}
            if(buscar){
                  Pattern  pattern2 = Pattern.compile("-\\|(.)*\n",Pattern.CASE_INSENSITIVE);
                  m = pattern2.matcher(dats);
                     while (m.find(en)) {
                         tokens = new StringTokenizer(str+dats.substring(m.start(), m.end()).replace("-", ""),"|");
                         break;
                     }
            }
           return tokens;
    }

    public static String conceitos(MapaDoTexto mapa){
        String texto = mapa.getConteudo();
        StringBuffer retorno = new StringBuffer();

        for (Regra elem : mapa.getRegras()) {
//            System.out.println("elemento = "+elem.getChave()+"\n------------");
            retorno.append("[CHAVE] ***"+elem.getChave()+"***\n");
           Pattern pattern = Pattern.compile("(denominado|chamado)?\\s"+elem.getChave()+"(\\w)+\\s(não)?(somos|será|foi|era|é|são)+\\s",Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(texto);
		while (matcher.find()) {
                        int i = matcher.start();
                        retorno.append("[INICIO] "+texto.substring(i, texto.indexOf(".", i)).replace("\n", " ").trim()+" [FIM]\n");
		}
                retorno.append("\n");
        }
        return retorno.toString();
    }
}
